<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <script type="module">

const getJson=function(url,id){
    return  new Promise(function(resolve, reject){
        const handler = function() {
        if (this.readyState !== 4) {
            return;
        }
        if (this.status === 200) {
            resolve(this.response);
        } else {
            reject(new Error(this.statusText));
        }
        };
        const client = new XMLHttpRequest();
        client.open("GET", url);
        client.onreadystatechange = handler;
        client.responseType = "json";
        client.setRequestHeader("Accept", "application/json");
        client.send();
        }).then((value)=>{
            // 让11,33延迟执行，测试是否是异步
            if (id==11 || id==22){
                let arr=new Array(100);
                arr.fill(7)
                for(let i=0;i<arr.length;i++){
                   console.log(arr[i]);
                }
            }
            console.log(id+'----'+value);
        }).catch((err)=>{
            console.log(err);
        });;
    }

   function* mygenerator(url){
    let nexturl22 = yield getJson(url,11);
    let nexturl33 =yield getJson(nexturl22,22);
    let nexturl44 =yield getJson(nexturl33,33);
    yield getJson(nexturl44,44);
  }

  //console.log("next1 start");
  let myiterator=mygenerator('./json/myjson2.json');
  myiterator.next();
  //console.log("next1 end");
  
  //console.log("next2 start");
  myiterator.next('./json/myjson2.json');
  //console.log("next2 end");

  //console.log("next3 start");
  myiterator.next('./json/myjson2.json');
  //console.log("next3 end");

  //console.log("next4 start");
  myiterator.next('./json/myjson.json');
  //console.log("next4 end");


//    myiterator.next().value.then((value)=>{

//     console.log(value);
//     myiterator.next('./json/myjson2.json').value.then((value)=>{
//         console.log(value);
//     }).catch((err)=>{
//         console.log(err);
//     });
//   }).catch((err)=>{
//     console.log(err);
//   });



function* genFuncWithReturn() {
  yield 'a';
  yield 'b';
  return 'The result';
}
function* logReturned(genObj) {
  let result = yield* genObj;
  yield result;
//   console.log(result);
}
console.log([...genFuncWithReturn()]);

// console.log([...logReturned(genFuncWithReturn())]);
// // The result
// // 值为 [ 'a', 'b' ]

// function* gen() {
//   yield 1;
//   return 2;
// }

// let g = gen();

// console.log(
//   g.next().value,
//   g.next().value,
// );

// function* F() {
//   this.a = 1;
//   yield this.b = 2;
//   yield this.c = 3;
// }

// let obj={name:"szq"};

// Reflect.getPrototypeOf(obj);
// var f = F.call(Reflect.getPrototypeOf(F).prototype);

// f.next();  // Object {value: 2, done: false}
// f.next();  // Object {value: 3, done: false}S
// f.next();  // Object {value: undefined, done: true}

// console.log(f.a); // 1
// console.log(f.b); // 2
// console.log(f.c); // 3

// function* g() {
  
// }

// g.prototype.hello = function () {
//   return 'hi!';
// };

// let obj = g();

// console.log(obj instanceof g) // true
// console.log(obj.hello()); // 'hi!'
// obj.next();
// console.log(obj.a); // 'hi!'

// // 使用yield*语句遍历完全二叉树。

// // 下面是二叉树的构造函数，
// // 三个参数分别是左树、当前节点和右树
// function Tree(left, label, right) {
//   this.left = left;
//   this.label = label;
//   this.right = right;
// }

// // 下面是中序（inorder）遍历函数。
// // 由于返回的是一个遍历器，所以要用generator函数。
// // 函数体内采用递归算法，所以左树和右树要用yield*遍历
// function* inorder(t) {
//   if (t) {
//     yield* inorder(t.left);
//     yield t.label;
//     yield* inorder(t.right);
//   }
// }

// // 下面生成二叉树
// function make(array) {
//   // 判断是否为叶节点
//   if (array.length == 1) return new Tree(null, array[0], null);
//   if (array.length == 2) return new Tree(make(array[0]), array[1], null);
//   if (array.length == 3) return new Tree(make(array[0]), array[1], make(array[2]));
// }
// let tree = make([[['a'], 'b', ['c']], 'd', [['e'], 'f', [['g'],'h']]]);

// // 遍历二叉树
// var result = [];
// for (let node of inorder(tree)) {
//   result.push(node);
// }

// console.log(result);
// ['a', 'b', 'c', 'd', 'e', 'f', 'g']

// function* foo() {
//   yield 2;
//   yield 3;
//   return "foo";
// }

// function* bar() {
//   yield 1;
//   let v= yield* foo();
//   console.log("v: " + v);
//   yield 4;
// }

// var it = bar();

// console.log(it.next())
// // {value: 1, done: false}
// console.log(it.next())
// // {value: 2, done: false}
// console.log(it.next())
// // {value: 3, done: false}
// console.log(it.next());
// // "v: foo"
// // {value: 4, done: false}
// console.log(it.next())
// // {value: undefined, done: true}

// let mygen=function* gen(){
//   yield* ["a", "b", "c"];
// }();

// console.log(mygen.next()); // { value:"a", done:false }
// console.log(mygen.next());
// console.log(mygen.next());
// console.log(mygen.next());

// let delegatedIterator = function* () {
//   yield 'Hello!';
//   yield 'Bye!';
// };

// let delegatingIterator = function* () {
//   yield 'Greetings!';
//   yield* delegatedIterator();
//   yield 'Ok, bye.';
// };

// for(let value of delegatingIterator()) {
//   console.log(value);
// }

// function* inner() {
//   yield 'hello!';
//   yield 'OK!';
// }

// // function* outer1() {
// //   yield 'open';
// //   yield inner();
// //   yield 'close';
// // }

// // var gen = outer1()
// // gen.next().value // "open"
// // gen.next().value // 返回一个遍历器对象
// // gen.next().value // "close"

// function* outer2() {
//   yield 'open'
//   yield* inner()
//   yield 'close'
// }

// var gen = outer2()
// gen.next().value // "open"
// gen.next().value // "hello!"
// gen.next().value // "OK!"
// gen.next().value // "close"

// function* gen() {
//   yield 1;
//   yield 2;
//   yield 3;
// }

// var g = gen();

// console.log(g.next());        // { value: 1, done: false }
// console.log(g.return('foo')); // { value: "foo", done: true }
// console.log(g.next());        // { value: undefined, done: true }

        // function* foo() {
        //     var x = yield 3;
        //     var y = x.toUpperCase();
        //     yield y;
        // }
        // var it = foo();
        // it.next(); // { value:3, done:false }
        // try {
        //     it.next(42);
        // } catch (err) {
        //     console.log(err);
        // }
        // it.next("ab");

        // var gen = function* gen(){
        // try {
        //     yield console.log('a');
        // } catch (e) {
        //     console.log(e);
        // }
        // yield console.log('b');
        // yield console.log('c');
        // }

        // var g = gen();
        // g.next() // a
        // g.throw() // b  throw方法被捕获以后，会附带执行下一条yield表达式。也就是说，会附带执行一次next方法。
        // g.next() // c

        // var g = function* () {
        //     let i=0;
        //     while (true) {
        //         try{
        //             i++;
        //             yield console.log('log--', String(i));
        //         }catch (e) {console.log('内部捕获', e);}
        //     }
        // };
        // var i = g();
        // i.next();
        // try {
        //     i.throw('a');
        //     i.throw('b');
        // } catch (e) {
        //     console.log('外部捕获', e);
        // }


        // var g = function* () {
        // while (true) {
        //     try {
        //         yield;
        //     } catch (e) {
        //     if (e != 'a') throw e;
        //     console.log('内部捕获', e);
        //     }
        // }
        // };

        // var i = g();
        // i.next();

        // try {
        //     throw new Error('a');
        //     throw new Error('b');
        // } catch (e) {
        //     console.log('外部捕获', e);
        // }     

        // var g = function* () {
        // try {
        //     yield;
        // } catch (e) {
        //     console.log('内部捕获', e);
        // }
        // };

        // var i = g();
        // i.next();
        // try {
        //     i.throw(new Error('出错了！'));
        //     i.throw('b');
        // } catch (e) {
        //     console.log('外部捕获', e);
        // }
        // // 内部捕获 a
        // // 外部捕获 b

        // function* numbers () {
        //     yield 1
        //     yield 2
        //     return 3
        //     yield 4
        // }

        // // 扩展运算符
        // [...numbers()] // [1, 2]

        // // Array.from 方法
        // Array.from(numbers()) // [1, 2]

        // // 解构赋值
        // let [x, y] = numbers();
        // x // 1
        // y // 2

        // // for...of 循环
        // for (let n of numbers()) {
        // console.log(n)
        // }
// 1
// 2
// var arr = [null,null,1, [[2, 3], 4], [5, 6], 7, {null:null, name: "szq", age: 11, [Symbol("sex")]: "man" }];
// import {deepSearchObj} from "./common.js";

// for (let item of deepSearchObj(arr)){

//     console.log(item);

// }


        // function* getItems(obj) {
        //     for (let key of Reflect.ownKeys(obj)) {
        //         yield [key, obj[key]]
        //     }
        // }
        // let myobj = { name: "szq", age: "11" };
        // for (let item of getItems(myobj)) {
        //     console.log(item);
        // }

        // let myobj = { name: "szq", age: "11" };
        // myobj[Symbol.iterator] = function* getItems() {
        //     for (let key of Reflect.ownKeys(this)) {
        //         yield [key, this[key]]
        //     }
        // }
        // for (let item of myobj) {
        //     console.log(item);
        // }
       


        // const myread = function (myfun0) {
        //     let t = myfun0();
        //     t.next();
        //     return t;

        // }

        // let myfun = function* read() {
        //     let x = yield "00";
        //     let y = `${yield "1" + x}`;
        //     let z = `${yield "2" + y}`;
        //     return "3" + z;
        // }

        // let tread = myread(myfun);
        // console.log(tread.next("1"));
        // console.log(tread.next("2"));
        // console.log(tread.next("3"));

// First input: hello!

        // function* dataConsumer() {
        //     console.log('Started');
        //     console.log(`1. ${yield}`);
        //     console.log(`2. ${yield}`);
        //     return 'result';
        // }

        // let genObj = dataConsumer();
        // genObj.next();
        // // Started
        // genObj.next('a')
        // // 1. a
        // genObj.next('b')
        // // 2. b

        // function* foo(x) {
        //     var y = 2 * (yield (x + 1));
        //     var z = yield (y / 3);
        //     return (x + y + z);
        // }

        // // var a = foo(5);
        // // a.next() // Object{value:6, done:false}
        // // a.next() // Object{value:NaN, done:false}
        // // a.next() // Object{value:NaN, done:true}

        // var b = foo(5);
        // b.next(10) // { value:6, done:false }
        // b.next(12) // { value:8, done:false }
        // b.next(13) // { value:42, done:true }

        // function* f() {
        //     for (var i = 0; true; i++) {
        //         var reset = yield i;
        //         if (reset) { i = -1; }
        //     }
        // }

        // var g = f();

        // console.log(g.next()); // { value: 0, done: false }
        // console.log(g.next()); // { value: 1, done: false }
        // console.log(g.next(true)); // { value: 0, done: false }

        // var myIterable = {};
        // myIterable[Symbol.iterator] = function* () {
        //     yield 1;
        //     yield 2;
        //     yield 3;
        //     return 4;
        // };

        // console.log([...myIterable]); // [1, 2, 3]


        // import { deepSearchvalues,deepSearchObj,deepSearchObj2 } from "./common.js";

        // // var arr = [1, [[2, 3], 4], [5, 6], 7, { name: "szq", age: 11, [Symbol("sex")]: "man" }];
        // var arr = {
        //     name: "szq",
        //     age: 11,
        //     [Symbol("sex")]: "man",
        //     other: [1, 2, 3,
        //         { other2: { other3: "4", ohter: 5, [Symbol("sex")]: "women" } }]
        // };
        // // console.log([...deepSearchvalues(arr)]);
        // // console.log([...deepSearchObj(arr)]);
        // // console.log([...deepSearchObj2(arr)]);
        // // console.log(...deepSearchObj2(arr))
        // // for (let f of deepSearchvalues(arr)) {
        // //     console.log(f);
        // // }



        // function* f() {
        //     console.log('执行了！')
        // }

        // var generator = f();

        // setTimeout(function () {
        //     generator.next()
        // }, 2000);


        // function* helloWorldGenerator() {
        //     yield 'hello';
        //     yield 'world';
        //     return 'ending';
        // }
        // var hw = helloWorldGenerator();

        // console.log(hw.next());
        // console.log(hw.next());
        // console.log(hw.next());
        // console.log(hw.next());

    </script>
</head>

<body>

</body>

</html>